/*******************************************************************************
  * 文件：NetComm_FileDownload.c
  * 作者：djy
  * 版本：v1.0.0
  * 日期：2020.04.29
  * 说明: 文件下载相关
*******************************************************************************/
#ifndef _NETCOMM_FILEDOWNLOAD_H
#define _NETCOMM_FILEDOWNLOAD_H

/* 头文件 --------------------------------------------------------------------*/
#include "NetComm_Typedefine.h"
#include "Macro.h"

#define NETCOMM_FILEDOWNLOAD

#define u8NETCOMM_FILEDOWNLOAD_MSGID_LEN        ((U8) 8)    //消息ID长度
#define u8NETCOMM_FILEDOWNLOAD_PACK_LEN         ((U8) 128)  //数据包长度

typedef enum
{
    eMSG_RECV  = 1,     //消息已收
    eMSG_READ  = 2,     //消息已读
    eMSG_DONE  = 3,     //处理完成
    eMSG_ERROR = 4,     //消息错误
}MsgHandleRet_te;

typedef enum
{
    eFILE_DOWNLOAD_FAIL        = -1,    //失败 
    eFILE_DOWNLOAD_NOT_START   = 0,     //未开始
    eFILE_DOWNLOAD_IN_PROGRESS = 1,     //进行中
    eFILE_DOWNLOAD_SUCCESS     = 2,     //下载成功
}FileStatus_te;//文件（下载）状态

typedef enum
{
	eMSG_INIT			= 0, //初始化（未注册，未注销）
    eMSG_WAIT_LOGON     = 1, //注册中
    eMSG_WAIT_LOGOUT    = 2, //注销中
    eMSG_ALREADY_LOGON  = 3, //已注册
    eMSG_ALREADY_LOGOUT = 4, //已注销    
}MsgStatus_te;//消息注册（销）状态

#pragma pack(1)
typedef struct
{
    U8 au8FileInforLen[2];  //文件信息长度，大端存储
    U8 au8FileFormat[2];    //文件格式，固定为0x0100
    U8 au8FileSize[4];      //文件大小，大端存储
    U8 u8Alg;               //Hash算法，固定为1(即MD5)
    U8 au8Hash[32];         //文件Hash值
    U8 au8Token[32];        //文件Token
    U8 au8UrlLen[2];        //URL长度，大端存储    
    U8 au8Url[1];           //URL，长度不确定
}FileInfor_ts;//文件信息

typedef struct
{
   U8  au8ContentLen[2];//content长度，此处全为0
   U8  au8Options[2];   //客户端处理消息选项，此处全为0
   U8  au8UILen[2];     //UI长度，大端存储
   U8  u8Style;         //固定为4
   U8  u8Type;          //固定为5
   U8  u8FileNums;      //文件数量，菜谱业务固定为1
   U8  au8FileInfor[1]; //文件信息，长度不确定
}MsgInfor_ts;//消息体

#pragma pack()


typedef struct
{
    U8              u8OverTimeTick;         //超时计数
    U8              au8MsgID[u8NETCOMM_FILEDOWNLOAD_MSGID_LEN]; //消息ID
    U16             u16MsgLen;              //消息长度
    U16             u16MsgRecvLen;          //已接收的消息长度
    MsgInfor_ts*    psMsgInfor;             //消息信息
	MsgStatus_te    eMsgStatus;             //消息状态
	FileStatus_te   eFileStatus;            //文件（下载）状态
    FileInfor_ts*   psFileInfor;            //文件信息
    U32             u32FileSize;            //文件总大小
    U32             u32FileRecvSize;        //已接收的文件大小
    U16             u16RoundNums;           //总轮数
    U16             u16CurRound;            //当前轮数
    U32             u32CurRoundOffsetAddr;  //当前轮次数据起始偏移地址
    U32             u32CurRoundSize;        //当前轮数据大小
    U32             u32CurRoundRecvSize;    //当前轮接收的数据大小
	U32				u32OffsetAddrBak;		//偏移地址备份，查询消息或文件时用于检测模块回复是否合法
	U16				u16LenBak;				//数据长度备份，查询消息或文件时用于检测模块回复是否合法
	Bool			bCurRoundRecvDoneFlag;	//当前轮次文件数据接收完成标志位
	Bool			bMsgRecvDoneFlag;	    //消息接收完成标志位
    Timer_ts        sMsgStatusCheckTimer;   //消息状态检测定时器
    Timer_ts        sCommOverTimeCheckTimer;//通信超时检测定时器
}NetCommFileDownload_ts;

typedef struct
{
	U16			u16StartTick;
	U8			u8EndTick;
	U8			u8ErrTick;
	Timer_ts	sTimer;
}FileDownloadShow_ts;

// 消息处理相关
void NetCommMsgLogOptsStart(MsgStatus_te eMsgStatus);           //消息注册（销）
void NetCommMsgLogOptsStartStop(void);							//消息注册注（销）停止
void NetCommMsgStatusSet(MsgStatus_te eMsgStatus);              //消息状态设置
U8   NetCommMsgStatusGet(void);                                 //消息状态获取
void NetCommMsgIDSet(U8 MsgID[]);                               //消息ID设置
U8*  NetCommMsgIDGet(void);                                     //消息ID获取
void NetCommMsgLenSet(U16 u16MsgLen);                           //消息长度设置
U16  NetCommMsgLenGet(void);                                    //消息长度获取
void NetCommMsgAsk(void);                                       //消息获取
void NetCommMsgErase(void);                                     //消息擦除
void NetCommMsgSave(U16 u16MsgOffsetAddr,U8* pu8MsgData,U8 pu8MsgDataLen); //消息保存
void NetCommMsgHandleRet(MsgHandleRet_te eResult,const S8* psErrNo); //消息处理结果返回

// 文件下载相关
void NetCommFileDownloadAsk(void);											// 文件下载请求
void NetCommFileInforAck(U16 u16FileInforID,U16 u16OffsetAddr,U16 U16Len);	// 文件信息应答
void NetCommFileDownloadStatusSet(FileStatus_te eFileStatus);				// 文件下载状态设置
S8   NetCommFileDownloadStatusGet(void);									// 文件下载状态获取						
void NetCommFileErase(void);												// 文件擦除
void NetCommFileAsk(void);													// 文件查询
void NetCommFileSave(U32 u32OffsetAddr,U8* pu8FileData,U16 u16Len);			// 文件保存
void NetCommFileHandleRet(U16 u16FileID,const S8* psErrNo);    				// 文件处理结果返回
void NetCommFileTransRoundSet(U16 u16RoundNums,U16 u16CurRound,U32 u32OffsetAddr,U32 u32Size);// 文件传输轮次信息设置
U32  NetCommFileSizeGet(void);												// 文件大小查询
	
// 流程相关
U32  NetCommOffsetAddrGet(void);
U16  NetCommLenGet(void);
void NetCommOverTimeCheckStop(void);		
void NetCommFileDownloadShowStart(void);	// 文件下载显示开始 
void NetCommFileDownload_Init(void);		// 文件下载相关初始化
#endif

